package com.killer_jin.core;

import org.redisson.spring.starter.RedissonAutoConfiguration;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.boot.web.servlet.ServletComponentScan;
import org.springframework.boot.web.servlet.support.SpringBootServletInitializer;
import org.springframework.cache.annotation.EnableCaching;
import org.springframework.context.annotation.PropertySource;
import org.springframework.context.annotation.PropertySources;
import org.springframework.scheduling.annotation.EnableScheduling;
import tk.mybatis.spring.annotation.MapperScan;

// 1.@SpringBootApplication是Spring Boot的核心注解，是一个组合注解,但他的核心功能是由@EnableAutoConfiguration注解提供的。
//   exclude = RedissonAutoConfiguration.class是排除了redisson的配置,因为不会使用到redisson的分布式锁功能
// 2.@EnableAutoConfiguration注解通过@Import导入配置功能，在AutoConfigurationImportSelector中，通过
//   SpringFactoriesLoader.loadFactoryNames扫描META-INF/spring.factories文件。
// 3.在spring.factories中，配置了需要自动配置的类，我们也可以通过这种方式添加自己的自动配置。
// 4.@MapperScan({"com.killer_jin.core.dao"})可以扫描所有mapper(dao)文件,可以将xml中的映射到mapper中的的方法
//   @EnableAspectJAutoProxy(exposeProxy = true) 暴露代理对象, 否则 AopContext.currentProxy() 会抛出异常
// 5.Spring Boot 使用事务非常简单，首先使用注解 @EnableTransactionManagement 开启事务支持后，
//   然后在访问数据库的Service方法上添加注解 @Transactional 便可
// 6.@ServletComponentScan用于servlet过滤器

@PropertySources({@PropertySource({"classpath:/application.properties"}),})
@MapperScan({"com.killer_jin.core.system.dao"})
@EnableScheduling
@EnableCaching
@ServletComponentScan
@SpringBootApplication(exclude = RedissonAutoConfiguration.class)
public class MySpringBootStarterCoreApplication extends SpringBootServletInitializer {
    @Override
    protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
        return application.sources(MySpringBootStarterCoreApplication.class);
    }

    public static void main(String[] args) {
        SpringApplication.run(MySpringBootStarterCoreApplication.class, args);
    }

}
